.intel_syntax noprefix
.global mulff
.text
mulff:

	push		ebp
	mov		ebp,	esp
	push	 	esi
	push		ebx
	push	 	edi
	
# calcular expoente
	mov		eax,	[ebp + 12]  #primeiro parametro
	mov		ecx,	[ebp + 16]  #segundo parametro	
	
	and 		eax,	0x7F800000
	sub		eax,	0x3F800000 # subtrair 127 ao expoente
	
	and		ecx,	0x7F800000
	sub		ecx,	0x3F800000 # subtrair 127 ao expoente
	
	add		eax, 	ecx
	add		eax,	0x3F800000 # somar 127 ao expoente
	mov		ebx,	eax # expoente em ebx
	#test		eax, 	0x01000000 #verificar se o segundo bit do expoente esta a 1
	
	#jnz		addnSft

# calcular mantissa
	mov		eax,	[ebp + 12]  #primeiro parametro
	mov		ecx,	[ebp + 16]  #segundo parametro
	
	and 		eax,	0x007FFFFF
	and		ecx,	0x007FFFFF
	or		eax,	0x800000
	or		ecx,	0x800000
	mul 		ecx		#multiplica eax (omitido) com ecx e guarda o resultado em edx:eax

	shr		eax, 	15
	sal		edx,	16
	or		eax,	edx # temos o valor da mantissa multiplicado em eax
	test		eax,	0x80000000
	jnz		addnSft
	shr		eax,	7
	mov 		edi,	eax # edi fica com a mantissa
	
sinal:
	mov		edx,	[ebp + 12]
	and		edx,	0x80000000
	mov		esi,	[ebp + 16]
	and		esi,	0x80000000
	xor		edx, 	esi
	
# construir o float
	or		eax, 	edx
	or		eax, 	ebx
	mov		[ebp + 8], eax #retorno do exercicio

	pop		edi
	pop		ebx
	pop		esi
	pop 		ebp
	ret

addnSft:
	shr		eax,	8
	add		ebx,	0x800000
	jmp 		sinal
